package com.jhws.common.pay.bo;

import com.jhws.business.customer.bo.PayCustomerSecret;

import java.util.List;
import java.util.Map;

public interface IOrderPayModule {

    /**
     * 获取模块名
     * @return
     */
    String [] getModuleName();

    /**
     * 获取模块类别
     * @return
     */
    String getPayModuleName();

    /**
     * 获取模块中文名，必须和上面的英文模块名一一对应
     * @return
     */
    String [] getModuleDesc();

    /**
     * 订单提交时预处理,参数检查等
     * @param order
     */
    boolean preCheck(Order order);

    /**
     * 订单完成时处理回调
     * @param order
     */
    void handle(Order order) throws Exception;

    /**
     * 接口实现类加载完后调用注册自身到核心服务
     * 因此必须注解@PostConstruct
     */
    void registerModule();

    /**
     * 通过订单数据找到对应的支付参数
     * @param order
     * @return
     */
    PayCustomerSecret findCustomerSecret(Order order) throws Exception;

    /**
     * 绑定某个客户的支付参数到该小区的此支付模块
     * @param id 支付实体ID,可能是小区编号，停车场编号等
     */
    void setCustomerId(String id,Long customId) throws Exception;

    /**
     * 获取该支付模块的基本信息
     *
     * 主要是在为客户绑定支付id与支付实体类型时，需要获取到各个模块的支付实体信息，比如每个停车场，每个小区等。
     * @return
     */
    List<PayModuleInfo> getPayModuleInfo(String orderType,String commCode);

    /**
     * 获取订单详情数据,并替换为用户可阅读的数据内容
     * @param order
     * @return
     */
    Map getDetailInfoForOrder(Order order);

}
